/**
 * @Copyright 2012, Founder Mobile Media Technology（Chongqing） Co., Ltd L.P. All
 *            rights reserved. The information contained herein is confidential
 *            and proprietary to Founder Mobile Media Technology（Chongqing） Co.,
 *            Ltd, and considered a trade secret as defined under civil and
 *            criminal statutes. Founder Mobile Media Technology（Chongqing） Co.,
 *            Ltd shall pursue its civil and criminal remedies in the event of
 *            unauthorized use or misappropriation of its trade secrets. Use of
 *            this information by anyone other than authorized employees of
 *            Founder Mobile Media Technology（Chongqing） Co., Ltd is granted
 *            only under a written non-disclosure agreement, expressly
 *            prescribing the scope and manner of such use.
 */
package com.g2room.tools.db.db2po;

import java.security.MessageDigest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

/**
 * String字符串的工具类<br>
 * 包括判断字符串是否为空、截取指定长度字符等
 *
 * @createTime: Jun 19, 2013 10:51:31 AM
 * @author: <a href="mailto:gaoxg@FOUNDER.COM.CN">Xuguo Gao</a>
 * @version: 0.1
 * @lastVersion: 0.1
 * @updateTime: 
 * @updateAuthor: <a href="mailto:gaoxg@FOUNDER.COM.CN">Xuguo Gao</a>
 * @changesSum: 
 * 
 */
public class StringUtil {
	/**
	 * 判断字符串是否为空，对null、“”进行了判断，没有对空格进行判断。<br>
	 * StringUtil.isNotBlank(null)  --> false<br>
	 * StringUtil.isNotBlank("")  --> false<br>
	 * StringUtil.isNotBlank(" ")  --> true<br>
	 * StringUtil.isNotBlank("    ")  --> true<br>
	 * StringUtil.isNotBlank("G2room.com")  --> true<br>
	 * StringUtil.isNotBlank(" G2room.com")  --> true<br>
	 * StringUtil.isNotBlank("G2room.com ")  --> true<br>
	 * StringUtil.isNotBlank("   G2room.com")  --> true<br>
	 * StringUtil.isNotBlank("  G2room.com ")  --> true<br>
	 * StringUtil.isNotBlank(" G2room .com")  --> true<br>
	 *
	 * @param {String}	str	要判断的字符串 
	 * @return {Boolean}	如果字符串为""或者为null，则返回false，反之则返回true。
	 *
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 19, 2013 2:04:05 PM
	 */
	public static boolean isNotEmpty(String str) {
		return !(null == str || str.length() == 0);
	}
	/**
	 * 判断字符串为空，包括判断null和“”,没有判断空格的空<br>
	 * StringUtil.isEmpty(null)  --> true<br>
	 * StringUtil.isEmpty("")  --> true<br>
	 * StringUtil.isEmpty(" ")  --> false<br>
	 * StringUtil.isEmpty("    ")  --> false<br>
	 * StringUtil.isEmpty("G2room.com")  --> false<br>
	 * StringUtil.isEmpty(" G2room.com")  --> false<br>
	 * StringUtil.isEmpty("G2room.com ")  --> false<br>
	 * StringUtil.isEmpty("   G2room.com")  --> false<br>
	 * StringUtil.isEmpty("  G2room.com ")  --> false<br>
	 * StringUtil.isEmpty(" G2room .com")  --> false<br>
	 *
	 * @param {String}	str	要判断的字符串 
	 * @return {Boolean}	如果为空，则返回true；反之返回false
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 19, 2013 3:35:37 PM
	 */
	public static boolean isEmpty(String str) {
		return null == str || str.length() == 0;
	}
	
	/**
	 * 判断字符串是否为空，对null、“”进行了判断，并且对空格进行判断。<br>
	 * StringUtil.isNotBlank(null)  --> false<br>
	 * StringUtil.isNotBlank("")  --> false<br>
	 * StringUtil.isNotBlank(" ")  --> false<br>
	 * StringUtil.isNotBlank("    ")  --> false<br>
	 * StringUtil.isNotBlank("G2room.com")  --> true<br>
	 * StringUtil.isNotBlank(" G2room.com")  --> true<br>
	 * StringUtil.isNotBlank("G2room.com ")  --> true<br>
	 * StringUtil.isNotBlank("   G2room.com")  --> true<br>
	 * StringUtil.isNotBlank("  G2room.com ")  --> true<br>
	 * StringUtil.isNotBlank(" G2room .com")  --> true<br>
	 *
	 * @param {String}	str	要判断的字符串 
	 * @return {Boolean}	如果字符串为""或者为null，则返回false，反之则返回true。
	 *
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 19, 2013 2:04:05 PM
	 */
	public static boolean isNotBlank(String str) {
		str = str.trim();
		return !(null == str || str.length() == 0);
	}
	
	/**
	 * 判断字符串是否为空，对null、“”进行了判断，并且对空格进行判断。<br>
	 * StringUtil.isBlank(null)  --> true<br>
	 * StringUtil.isBlank("")  --> true<br>
	 * StringUtil.isBlank(" ")  --> true<br>
	 * StringUtil.isBlank("    ")  --> true<br>
	 * StringUtil.isBlank("G2room.com")  --> false<br>
	 * StringUtil.isBlank(" G2room.com")  --> false<br>
	 * StringUtil.isBlank("G2room.com ")  --> false<br>
	 * StringUtil.isBlank("   G2room.com")  --> false<br>
	 * StringUtil.isBlank("  G2room.com ")  --> false<br>
	 * StringUtil.isBlank(" G2room .com")  --> false<br>
	 *
	 * @param {String}	str	要判断的字符串 
	 * @return {Boolean}	如果字符串为""或者为null或为空格，则返回true，反之则返回false。
	 *
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 19, 2013 2:04:05 PM
	 */
	public static boolean isBlank(String str) {
		str = str.trim();
		return null == str || str.length() == 0;
	}
	
	/**
	 * 不区分大小写比较两个字符串是否相等<br>
	 * StringUtil.equalsIgnoreCase(null, null)  --> true<br>
	 * StringUtil.equalsIgnoreCase(null, "")  --> false<br>
	 * StringUtil.equalsIgnoreCase(null, "G2room.com")  --> false<br>
	 * StringUtil.equalsIgnoreCase("G2ROOM.COM", "G2room.com") --> true<br>
	 * StringUtil.equalsIgnoreCase("G2Room.COM", "G2room.com") --> true<br>
	 * StringUtil.equalsIgnoreCase("G2room.com", "G2room.com") --> true<br>
	 *
	 * @param {String} str1 比较的第一个字符串
	 * @param {String} str2 比较的第二个字符串
	 * @return {boolean} 如果两个字符串不区分大小写相等，则返回true；反之则返回false
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 19, 2013 4:40:31 PM
	 */
	public static boolean equalsIgnoreCase(String str1, String str2) {
		boolean rs = false;
		if(str1 == null || str2 ==null) {
			rs = str1 == str2;
		} else {
			rs = str1.toLowerCase().equals(str2.toLowerCase());
		}
		return rs;
	}
	/**
	 * 从字符串左边截取指定长度的子串并返回<br>
	 * 如果所给长度小于1，则返回“”；如果所给长度大于字符串长度，则返回所有字符串<br>
	 * StringUtil.leftSubstr(null, 1)  --> ""<br>
	 * StringUtil.leftSubstr("G2Room.COM", 0) --> ""<br>
	 * StringUtil.leftSubstr("G2ROOM.COM", 6) --> "G2ROOM"<br>
	 * StringUtil.leftSubstr("G2room.com", 10) --> "G2room.com"<br>
	 * StringUtil.leftSubstr("G2room.com", 11) --> "G2room.com"<br>
	 *
	 * @param {String} str	要截取的字符串
	 * @param {int} len	要截取的长度
	 * @return {String}
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 19, 2013 4:56:22 PM
	 */
	public static String leftSubstr(String str, int len) {
		String rsStr = "";
		if(null != str && len>-1) {
			if(str.length() > len) {
				rsStr = str.substring(0, len);
			} else {
				rsStr = str;
			}
		}
		return rsStr;
	}
	/**
	 * 从字符串右边截取指定长度的子串并返回<br>
	 * 如果所给长度小于1，则返回“”；如果所给长度大于字符串长度，则返回所有字符串<br>
	 * StringUtil.rightSubstr(null, 1)  --> ""<br>
	 * StringUtil.rightSubstr("G2Room.COM", 0) --> ""<br>
	 * StringUtil.rightSubstr("G2ROOM.COM", 6) --> "om.COM"<br>
	 * StringUtil.rightSubstr("G2room.com", 10) --> "G2room.com"<br>
	 * StringUtil.rightSubstr("G2room.com", 11) --> "G2room.com"<br>
	 *
	 * @param {String} str	要截取的字符串
	 * @param {int} len	要截取的长度
	 * @return {String}
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 19, 2013 4:56:22 PM
	 */
	public static String rightSubstr(String str, int len) {
		String rsStr = "";
		if(null != str && len>-1) {
			if(str.length() > len) {
				rsStr = str.substring(str.length() - len);
			} else {
				rsStr = str;
			}
		}
		return rsStr;
	}
	/**
	 * 从字符串左边开始，替换指定位置的指定长度字符串为*号<br>
	 * StringUtil.replace2Start(null, 1)  --> ""<br>
	 * StringUtil.replace2Start("G2Room.COM", 0, 5) --> "*****m.COM"<br>
	 * StringUtil.replace2Start("G2ROOM.COM", 2, 3) --> "G2***M.COM"<br>
	 * StringUtil.replace2Start("G2ROOM.COM", 3, 2) --> "G2R**M.COM"<br>
	 * StringUtil.replace2Start("G2room.com", 2, 16) --> "G2********"<br>
	 * StringUtil.replace2Start("G2room.com", 11, 2) --> "G2room.com"<br>
	 *
	 * @param {String} str	要截取的字符串
	 * @param {int} pos	要替换的位置
	 * @param {int} len	要替换的字符长度
	 * @return {String}
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 19, 2013 4:56:22 PM
	 */
	public static String replace2Start(String str, int pos, int len) {
		String rsStr = "";
		if(null != str && len>-1) {
			int length = str.length();
			if(length > pos) {
				rsStr = str.substring(pos, len + pos > length ? length : len + pos);
				StringBuffer startSb = new StringBuffer();
				for(int i = 0; i< rsStr.length(); i++) {
					startSb.append("*");
				}
				rsStr = str.replace(rsStr, startSb.toString());
			} else {
				rsStr = str;
			}
		}
		return rsStr;
	}

	/**
	 * 左补齐。如果所给字符串的长度没有超过指定的位数，则使用所给字符进行左补齐，<br>
	 * 如果所给字符为空或”“，则返回指定位数的指定字符<br>
	 * 如果所给字符长度大于等于指定位数，则返回原字符串<br>
	 * 
	 * StringUtil.leftPad(null, 3, 'g')  --> "ggg"<br>
	 * StringUtil.leftPad("", 3, 'g') --> "ggg"<br>
	 * StringUtil.leftPad("G2ROOM.COM", 6, 'g') --> "G2ROOM.COM"<br>
	 * StringUtil.leftPad("G2ROOM.COM", 10, 'g') --> "G2ROOM.COM"<br>
	 * StringUtil.leftPad("G2ROOM.COM", 14, 'g') --> "ggggG2ROOM.COM"<br>
	 *
	 * @param {String} str	需要补齐的字符串
	 * @param {int} size	指定的位数
	 * @param {char} padChar	替换字符
	 * @return {String} 替换后的字符串
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 20, 2013 5:47:28 PM
	 */
	public static String leftPad(String str, int size, char padChar) {
		int len;
		if(null == str) {
			str = "";
		}
		StringBuffer rsSb = new StringBuffer();
		len = str.length();
		if (len < size) {
			for (int i = 0; i < size - len; i++) {
				rsSb.append(padChar);
			}
		}
		rsSb.append(str);
		return rsSb.toString();
	}
	/**
	 * 传入字符的首字母大写，如果传入字符为null或者“”，则返回传入字符串<br>
	 * 
	 * StringUtil.capitalize(null)  --> null<br>
	 * StringUtil.capitalize("") --> ""<br>
	 * StringUtil.capitalize("G") --> "G"<br>
	 * StringUtil.capitalize("G2ROOM.COM") --> "G2ROOM.COM"<br>
	 * StringUtil.capitalize("g2room.com") --> "G2room.com"<br>
	 *
	 * @param str
	 * @return
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 20, 2013 5:37:58 PM
	 */
	public static String capitalize(String str) {
		String rsStr;
        if (str == null || str.length() == 0) {
        	rsStr = str;
        } else {
        	rsStr = str.substring(0, 1).toUpperCase() + str.substring(1);
        }
        return rsStr; 
	}
	/**
	 * 传入带下划线的字符串，改为驼峰命名法<br>
	 * 
	 * StringUtil.hump4Underline(null)  --> null<br>
	 * StringUtil.hump4Underline("") --> ""<br>
	 * StringUtil.hump4Underline("G") --> "g"<br>
	 * StringUtil.hump4Underline("g2room_com") --> "g2roomCom"<br>
	 * StringUtil.capitalize("g2roOm_cOM") --> "g2roomCom"<br>
	 *
	 * @param str
	 * @return
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 20, 2013 5:37:58 PM
	 */
	public static String hump4Underline(String str) {
		StringBuffer rsSb = new StringBuffer();
		if (str == null || str.length() == 0) {
			rsSb.append(str);
		} else {
			if(str.contains("_")) {
				String[] temps = str.split("_");
				for(String s : temps) {
					if(rsSb.length() == 0) {
						rsSb.append(s.toLowerCase());
					} else {
						rsSb.append(s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase());
					}
				}
			} else {
				rsSb.append(str.toLowerCase());
			}
		}
		return rsSb.toString(); 
	}
	/**
	 * 传入字符的首字母小写，如果传入字符为null或者“”，则返回传入字符串<br>
	 * 
	 * StringUtil.capitalize(null)  --> null<br>
	 * StringUtil.capitalize("") --> ""<br>
	 * StringUtil.capitalize("G") --> "g"<br>
	 * StringUtil.capitalize("G2ROOM.COM") --> "g2ROOM.COM"<br>
	 * StringUtil.capitalize("g2room.com") --> "g2room.com"<br>
	 *
	 * @param str
	 * @return
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 20, 2013 5:37:58 PM
	 */
	public static String minuscule(String str) {
		String rsStr;
		if (str == null || str.length() == 0) {
			rsStr = str;
		} else {
			rsStr = str.substring(0, 1).toLowerCase() + str.substring(1);
		}
		return rsStr; 
	}
	
	/**
	 * 时间转换为字符串
	 *
	 * @param {Date} date	需要格式化的日期
	 * @param {String} format	格式化字符串，如yyyy-MM-dd HH:mm:ss
	 * @return
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * May 16, 2013 3:44:23 PM
	 */
	public static String date2String(Date date, String format) {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(date);
	}
	
	/**
	 * md5加密方法，传入字符串，生成32位的密文
	 *
	 * @param {String} text 需要加密的文本内容
	 * @return {String} 加密后的32位密文
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * Jun 6, 2013 10:44:02 AM
	 */
	public final static String md5(String text) {
		// 操作字符串
		StringBuffer sb = new StringBuffer();
		try {
			// MessageDigest 类为应用程序提供信息摘要算法的功能，如 MD5 或 SHA 算法。
			MessageDigest md = MessageDigest.getInstance("MD5");

			// 添加要进行计算摘要的信息,使用 text 的 byte 数组更新摘要。
			md.update(text.getBytes());
			// 计算出摘要,完成哈希计算。
			byte b[] = md.digest();
			int i;
			for (int offset = 0; offset < b.length; offset++) {
				i = b[offset];
				if (i < 0) {
					i += 256;
				}
				if (i < 16) {
					sb.append("0");
				}
				// 将整型 十进制 i 转换为16位，用十六进制参数表示的无符号整数值的字符串表示形式。
				sb.append(Integer.toHexString(i));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sb.toString();
	}
	
	/**
	 * 获取指定位数的数字
	 * 
	 * @param len
	 *            指定长度
	 * @return
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a> May 16, 2013
	 *         5:28:43 PM
	 */
	public static String genRandomNum(int len) {
		//35是因为数组是从0开始的，26个字母+10个数字
		final int maxNum = 36;
		int i; //生成的随机数
		int count = 0; //生成的密码的长度
		char[] str = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
		StringBuffer pwd = new StringBuffer("");
		Random r = new Random();
		while (count < len) {
			//生成随机数，取绝对值，防止生成负数，
			i = Math.abs(r.nextInt(maxNum)); //生成的数最大为36-1
			if (i >= 0 && i < str.length) {
				pwd.append(str[i]);
				count++;
			}
		}
		return pwd.toString();
	}
	
	/**
	 * 转变String类型的日期为Date类型
	 *
	 * @param dateStr
	 * @param format
	 * @return
	 * @throws ParseException
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * Jun 15, 2013 11:14:51 AM
	 */
	public static Date String2Date(String dateStr, String format) throws ParseException {
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		return dateFormat.parse(dateStr);
	}
}
